home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 11
/
Cream of the Crop 11-1.iso
/
games
/
ted5.zip
/
TED5_A.ASM
< prev
next >
Wrap
Assembly Source File
|
1993-02-04
|
22KB
|
1,385 lines
;====================================================
;
; TED5 ASM Routines
;
;====================================================
IDEAL
P386N
MODEL medium,C
extrn XMSdriver:DWORD
extrn videomode:WORD,xmshandle:WORD,XMSlookup:WORD
extrn tilenum:WORD,lasticon:WORD,firsticon:WORD
extrn CGAlookup:WORD,EGA1lookup:WORD,EGA2lookup:WORD,VGAlookup:WORD
DATASEG
SCindex = 3c4h
SCmapmask = 2
GCindex = 3CEh
GCreadmap = 4
GCmode = 5
CombTable dw CombineCGA,CombineEGA,CombineEGA,CombineVGA
DrawTable dw DrawTCGA,DrawTEGA1,DrawTEGA2,DrawTVGA
OverTable dw OverlayCGA,OverlayEGA,OverlayEGA,OverlayVGA
cgacolors db 55h,0aah
egacolors dw 0,0ffffh
oldh db 0
oldy dw 0
horzadd dw 0
wsize dw 1,2,4
hsize dw 8,16,32
twidth dw 0
theight dw 0
bmlen dw 0
masklen dw 0
csize dw 32,64,256
esize dw 32,128,512
vsize dw 64,256,1024
cmsize dw 64,128,512
emsize dw 40,160,640
vmsize dw 128,512,2048
PUBLIC tdata
tdata db 2048 dup(?)
tdata1 db 2048 dup(?)
;
; XMS move structure
;
blen dw 0,0
shandle dw 0
soff dd 0
dhandle dw 0
doff dd tdata1
Csparse dw csp8,csp16,csp32
Esparse dw esp8,esp16,esp32
Vsparse dw vsp8,vsp16,vsp32
csp8 db 0ffh,0ffh
REPT 7
db 0c0h,0
ENDM
csp16 db 4 dup (0ffh)
REPT 15
db 0c0h
db 3 dup (0)
ENDM
csp32 db 8 dup (0ffh)
REPT 31
db 0c0h
db 7 dup(0)
ENDM
LABEL esp8 BYTE
REPT 4
db 0ffh
db 7 dup (80h)
ENDM
LABEL esp16 BYTE
REPT 4
db 0ffh,0ffh
REPT 15
db 80h,0
ENDM
ENDM
LABEL esp32 BYTE
REPT 4
db 4 dup (0ffh)
REPT 31
db 80h,0,0,0
ENDM
ENDM
vsp8 db 8 dup(0ffh)
REPT 7
db 0ffh,7 dup(0)
ENDM
vsp16 db 16 dup(0ffh)
REPT 15
db 0ffh,15 dup(0)
ENDM
vsp32 db 32 dup(0ffh)
REPT 31
db 0ffh,31 dup(0)
ENDM
CODESEG
;====================================================
;
; Combine tiles together (background,foreground,icons)
;
;====================================================
PUBLIC CombineTiles
PROC CombineTiles
ARG tileb:WORD,tilef:WORD,tilei:WORD,tsize:WORD
push si
push di
cld
mov bx,[tsize]
shl bx,1
mov dx,[hsize+bx-2]
mov [theight],dx
mov cx,[wsize+bx-2]
mov [twidth],cx
mov ax,[xmshandle]
mov [shandle],ax ;set XMS handle
mov si,[videomode]
shl si,1
mov ax,[CombTable+si]
jmp ax
;
; Combine CGA tiles
;
LABEL CombineCGA PROC
shl [twidth],1
mov cx,[cmsize+bx-2]
mov [bmlen],cx
mov ax,[csize+bx-2] ;get length of block to move
mov [blen],ax
sub cx,ax
mov [masklen],cx
;
; Handle the background tiles first!
;
mov ax,[tileb]
cmp ax,8000h ;solid color?
jb @@c1
neg ax
mov di,ds
mov es,di
mov di,OFFSET tdata
mov bx,ax
and bx,1
mov al,[cgacolors+bx]
mov cx,[blen]
rep stosb
jmp SHORT @@c2
@@c1:
shl ax,2
mov bx,ax
mov es,[XMSlookup] ;(LONG SEG *)
mov ax,[es:bx]
mov [WORD PTR soff],ax
mov ax,[es:bx+2]
mov [WORD PTR soff+2],ax
cmp ax,-1 ;SPARSE TILE?
je @@c1a
mov ax,OFFSET tdata ;(quickie modification since "doff"
mov [WORD doff],ax ; should always point to "tdata1")
mov si,OFFSET blen
mov ah,11
call [DWORD XMSdriver] ;move tile into tdata1
mov ax,OFFSET tdata1
mov [WORD doff],ax ;ahhh....back to normal
jmp @@c2
;
; Copy sparse tile to tdata
;
@@c1a:
mov bx,[tsize]
shl bx,1
mov si,[Csparse+bx-2]
mov di,OFFSET tdata
mov cx,[blen]
shr cx,1 ;for WORD copy
mov ax,ds
mov es,ax
rep movsw
;
; Handle foreground tiles
;
@@c2:
mov bx,[tilef]
cmp bx,0
je @@c3 ;any masked tile?
shl bx,2
mov es,[XMSlookup]
mov ax,[es:bx]
mov [WORD PTR soff],ax
mov ax,[es:bx+2]
mov [WORD PTR soff+2],ax
cmp ax,-1 ;SPARSE MASKED TILE?
je @@c3
mov ax,[bmlen]
mov [blen],ax ;set masked tile length for XMS copy
mov si,OFFSET blen
mov ah,11
call [DWORD XMSdriver] ;move tile into tdata1
;
; now we have the masked tile in "tdata1".
; time to mask it onto "tdata"
;
mov si,OFFSET tdata1
add si,[masklen] ;SI = masked tile's tiledata
mov di,OFFSET tdata ;DI = tile in "tdata"
mov dx,[theight]
mov bx,OFFSET tdata1 ;BX = mask
@@c2a:
mov cx,[twidth]
@@c2b:
mov al,[bx] ;get mask byte
and [di],al ;and tdata with it
lodsb ;get tilem byte
or [di],al ;OR it onto tdata
inc di
inc bx
loop @@c2b
dec dx
jnz @@c2a
;
; Handle icons (foreground tiles)
;
@@c3:
mov bx,[tilei]
cmp bx,[lasticon]
ja @@cexit ;any icons?
cmp bx,[firsticon]
jbe @@cexit
shl bx,2
mov es,[XMSlookup]
mov ax,[es:bx]
mov [WORD PTR soff],ax
mov ax,[es:bx+2]
mov [WORD PTR soff+2],ax
mov ax,[bmlen]
mov [blen],ax ;set masked tile length for XMS copy
mov si,OFFSET blen
mov ah,11
call [DWORD XMSdriver] ;move tile into tdata1
;
; now we have the masked tile in "tdata1".
; time to mask it onto "tdata"
;
mov si,OFFSET tdata1
add si,[masklen] ;SI = masked tile's tiledata
mov di,OFFSET tdata ;DI = tile in "tdata"
mov dx,[theight]
mov bx,OFFSET tdata1 ;BX = mask
@@c3a:
mov cx,[twidth]
@@c3b:
mov al,[bx] ;get mask byte
and [di],al ;and tdata with it
lodsb ;get tilem byte
or [di],al ;OR it onto tdata
inc di
inc bx
loop @@c3b
dec dx
jnz @@c3a
@@cexit:
pop di
pop si
ret
;
; Combine EGA tiles
;
LABEL CombineEGA PROC
mov cx,[emsize+bx-2]
mov [bmlen],cx
mov ax,[esize+bx-2] ;get length of block to move
mov [blen],ax
sub cx,ax
mov [masklen],cx
;
; Handle the background tiles first!
;
mov ax,[tileb]
cmp ax,8000h ;solid color?
jb @@e1
neg ax
mov di,ds
mov es,di
mov di,OFFSET tdata
mov dx,ax
mov cx,[blen] ;plane 0
shr cx,3
mov bx,dx
shr dx,1
and bx,1
shl bx,1
mov ax,[egacolors+bx]
rep stosw
mov cx,[blen] ;plane 1
shr cx,3
mov bx,dx
shr dx,1
and bx,1
shl bx,1
mov ax,[egacolors+bx]
rep stosw
mov cx,[blen] ;plane 2
shr cx,3
mov bx,dx
shr dx,1
and bx,1
shl bx,1
mov ax,[egacolors+bx]
rep stosw
mov cx,[blen] ;plane 3
shr cx,3
mov bx,dx
shr dx,1
and bx,1
shl bx,1
mov ax,[egacolors+bx]
rep stosw
jmp SHORT @@e2
@@e1:
shl ax,2
mov bx,ax
mov es,[XMSlookup] ;(LONG SEG *)
mov ax,[es:bx]
mov [WORD PTR soff],ax
mov ax,[es:bx+2]
mov [WORD PTR soff+2],ax
cmp ax,-1 ;SPARSE TILE?
je @@e1a
mov ax,OFFSET tdata ;(quickie modification since "doff"
mov [WORD doff],ax ; should always point to "tdata1")
mov si,OFFSET blen
mov ah,11
call [DWORD XMSdriver] ;move tile into tdata1
mov ax,OFFSET tdata1
mov [WORD doff],ax ;ahhh....back to normal
jmp @@e2
;
; Copy sparse tile to tdata
;
@@e1a:
mov bx,[tsize]
shl bx,1
mov si,[Esparse+bx-2]
mov di,OFFSET tdata
mov cx,[blen]
shr cx,1 ;for WORD copy
mov ax,ds
mov es,ax
rep movsw
;
; Handle foreground tiles
;
@@e2:
mov bx,[tilef]
cmp bx,0
je @@e3 ;any masked tile?
shl bx,2
mov es,[XMSlookup]
mov ax,[es:bx]
mov [WORD PTR soff],ax
mov ax,[es:bx+2]
mov [WORD PTR soff+2],ax
cmp ax,-1 ;SPARSE MASKED TILE?
je @@e3
mov ax,[bmlen]
mov [blen],ax ;set masked tile length for XMS copy
mov si,OFFSET blen
mov ah,11
call [DWORD XMSdriver] ;move tile into tdata1
;
; now we have the masked tile in "tdata1".
; time to mask it onto "tdata"
;
mov si,OFFSET tdata1
add si,[masklen] ;SI = masked tile's tiledata
mov di,OFFSET tdata ;DI = tile in "tdata"
mov ah,4
@@e2a0:
mov dx,[theight]
mov bx,OFFSET tdata1 ;BX = mask
@@e2a:
mov cx,[twidth]
@@e2b:
mov al,[bx] ;get mask byte
and [di],al ;and tdata with it
lodsb ;get tilem byte
or [di],al ;OR it onto tdata
inc di
inc bx
loop @@e2b
dec dx
jnz @@e2a
dec ah
jnz @@e2a0 ;do all 4 planes!
;
; Handle icons (foreground tiles)
;
@@e3:
mov bx,[tilei]
cmp bx,[lasticon]
ja @@eexit ;any icons?
cmp bx,[firsticon]
jbe @@eexit
shl bx,2
mov es,[XMSlookup]
mov ax,[es:bx]
mov [WORD PTR soff],ax
mov ax,[es:bx+2]
mov [WORD PTR soff+2],ax
mov ax,[bmlen]
mov [blen],ax ;set masked tile length for XMS copy
mov si,OFFSET blen
mov ah,11
call [DWORD XMSdriver] ;move tile into tdata1
;
; now we have the masked tile in "tdata1".
; time to mask it onto "tdata"
;
mov si,OFFSET tdata1
add si,[masklen] ;SI = masked tile's tiledata
mov di,OFFSET tdata ;DI = tile in "tdata"
mov ah,4
@@e3a0:
mov dx,[theight]
mov bx,OFFSET tdata1 ;BX = mask
@@e3a:
mov cx,[twidth]
@@e3b:
mov al,[bx] ;get mask byte
and [di],al ;and tdata with it
lodsb ;get tilem byte
or [di],al ;OR it onto tdata
inc di
inc bx
loop @@e3b
dec dx
jnz @@e3a
dec ah
jnz @@e3a0 ;do all 4 planes!
@@eexit:
pop di
pop si
ret
;
; Combine VGA tiles
;
LABEL CombineVGA PROC
shl [twidth],3
mov cx,[vmsize+bx-2]
mov [bmlen],cx
mov ax,[vsize+bx-2] ;get length of block to move
mov [blen],ax
sub cx,ax
mov [masklen],cx
;
; Handle the background tiles first!
;
mov ax,[tileb]
cmp ax,8000h ;solid color?
jb @@v1
neg ax
mov di,ds
mov es,di
mov di,OFFSET tdata
shl ax,4
mov bx,[blen]
shr bx,3
mov cx,bx
rep stosb
inc al
mov cx,bx
rep stosb
inc al
mov cx,bx
rep stosb
inc al
mov cx,bx
rep stosb
inc al
mov cx,bx
rep stosb
inc al
mov cx,bx
rep stosb
inc al
mov cx,bx
rep stosb
inc al
mov cx,bx
rep stosb
jmp SHORT @@v2
@@v1:
shl ax,2
mov bx,ax
mov es,[XMSlookup] ;(LONG SEG *)
mov ax,[es:bx]
mov [WORD PTR soff],ax
mov ax,[es:bx+2]
mov [WORD PTR soff+2],ax
cmp ax,-1 ;SPARSE TILE?
je @@v1a
mov ax,OFFSET tdata ;(quickie modification since "doff"
mov [WORD doff],ax ; should always point to "tdata1")
mov si,OFFSET blen
mov ah,11
call [DWORD XMSdriver] ;move tile into tdata1
mov ax,OFFSET tdata1
mov [WORD doff],ax ;ahhh....back to normal
jmp @@v2
;
; Copy sparse tile to tdata
;
@@v1a:
mov bx,[tsize]
shl bx,1
mov si,[Vsparse+bx-2]
mov di,OFFSET tdata
mov cx,[blen]
shr cx,1 ;for WORD copy
mov ax,ds
mov es,ax
rep movsw
;
; Handle foreground tiles
;
@@v2:
mov bx,[tilef]
cmp bx,0
je @@v3 ;any masked tile?
shl bx,2
mov es,[XMSlookup]
mov ax,[es:bx]
mov [WORD PTR soff],ax
mov ax,[es:bx+2]
mov [WORD PTR soff+2],ax
cmp ax,-1 ;SPARSE MASKED TILE?
je @@v3
mov ax,[bmlen]
mov [blen],ax ;set masked tile length for XMS copy
mov si,OFFSET blen
mov ah,11
call [DWORD XMSdriver] ;move tile into tdata1
;
; now we have the masked tile in "tdata1".
; time to mask it onto "tdata"
;
mov si,OFFSET tdata1
add si,[masklen] ;SI = masked tile's tiledata
mov di,OFFSET tdata ;DI = tile in "tdata"
mov dx,[theight]
mov bx,OFFSET tdata1 ;BX = mask
@@v2a:
mov cx,[twidth]
@@v2b:
mov al,[bx] ;get mask byte
and [di],al ;and tdata with it
lodsb ;get tilem byte
or [di],al ;OR it onto tdata
inc di
inc bx
loop @@v2b
dec dx
jnz @@v2a
;
; Handle icons (foreground tiles)
;
@@v3:
mov bx,[tilei]
cmp bx,[lasticon]
ja @@vexit ;any icons?
cmp bx,[firsticon]
jbe @@vexit
shl bx,2
mov es,[XMSlookup]
mov ax,[es:bx]
mov [WORD PTR soff],ax
mov ax,[es:bx+2]
mov [WORD PTR soff+2],ax
mov ax,[bmlen]
mov [blen],ax ;set masked tile length for XMS copy
mov si,OFFSET blen
mov ah,11
call [DWORD XMSdriver] ;move tile into tdata1
;
; now we have the masked tile in "tdata1".
; time to mask it onto "tdata"
;
mov si,OFFSET tdata1
add si,[masklen] ;SI = masked tile's tiledata
mov di,OFFSET tdata ;DI = tile in "tdata"
mov dx,[theight]
mov bx,OFFSET tdata1 ;BX = mask
@@v3a:
mov cx,[twidth]
@@v3b:
mov al,[bx] ;get mask byte
and [di],al ;and tdata with it
lodsb ;get tilem byte
or [di],al ;OR it onto tdata
inc di
inc bx
loop @@v3b
dec dx
jnz @@v3a
@@vexit:
pop di
pop si
ret
ENDP
;====================================================
;
; Draw a tile in any of the video modes
; NOTE: ONLY WORKS WITH TSIZE=2!
;
;====================================================
PUBLIC DrawTile
PROC DrawTile
ARG x:WORD,y:WORD,tsize:WORD
push si
push di
mov bx,[tsize]
shl bx,1
mov ah,[BYTE PTR hsize+bx-2]
mov [oldh],ah
mov cx,[wsize+bx-2]
mov bx,[videomode]
shl bx,1
mov dx,[DrawTable+bx]
mov bx,[y]
shl bx,1
jmp dx
label DrawTCGA proc
mov ax,0b800h
mov es,ax
mov si,OFFSET tdata
mov di,[x]
shl di,1
add di,[CGAlookup+bx]
mov bx,cx
shl bx,1
mov ah,[oldh]
@@c1:
mov cx,bx
rep movsb
sub di,bx
xor di,2000h
mov cx,bx
rep movsb
sub di,bx
xor di,2000h
add di,80
sub ah,2
jnz @@c1
pop di
pop si
ret
;
; EGA1/2/3 TILE DRAW ROUTINES
;
label DrawTEGA1 proc
mov [horzadd],38
mov di,[EGA1lookup+bx]
jmp SHORT DoDrawEGAT
label DrawTEGA2 proc
mov [horzadd],78
mov di,[EGA2lookup+bx]
jmp SHORT DoDrawEGAT
label DoDrawEGAT proc
add di,[x]
mov [oldy],di
mov si,OFFSET tdata
mov bx,0a000h
mov es,bx
mov bx,cx
;
; AH : height
; BX : width
; ES:DI : dest
; DS:SI : source
;
cld
mov dx,GCindex
mov al,GCmode
out dx,al
inc dx
mov al,0
out dx,al
;
; Plane 0
;
mov dx,SCindex
mov al,SCmapmask
out dx,al
inc dx
mov al,1
out dx,al
mov dx,[horzadd]
@@1:
mov cx,bx
rep movsb
add di,dx
dec ah
jne @@1
;
; Plane 1
;
mov dx,SCindex
mov al,SCmapmask
out dx,al
inc dx
mov al,2
out dx,al
mov dx,[horzadd]
mov di,[oldy]
mov ah,[oldh]
@@2:
mov cx,bx
rep movsb
add di,dx
dec ah
jne @@2
;
; Plane 2
;
mov dx,SCindex
mov al,SCmapmask
out dx,al
inc dx
mov al,4
out dx,al
mov dx,[horzadd]
mov di,[oldy]
mov ah,[oldh]
@@3:
mov cx,bx
rep movsb
add di,dx
dec ah
jne @@3
;
; Plane 3
;
mov dx,SCindex
mov al,SCmapmask
out dx,al
inc dx
mov al,8
out dx,al
mov dx,[horzadd]
mov di,[oldy]
mov ah,[oldh]
@@4:
mov cx,bx
rep movsb
add di,dx
dec ah
jne @@4
pop di
pop si
ret
label DrawTVGA proc
mov ax,0a000h
mov es,ax
mov si,OFFSET tdata
mov di,[x]
shl di,3
add di,[VGAlookup+bx]
mov bx,cx
shl bx,2
mov ah,[oldh]
@@v1:
mov cx,bx
rep movsw
add di,304
dec ah
jnz @@v1
pop di
pop si
ret
ENDP
;////////////////////////////////////////////////////////////////////
;
; TED5 screen scroll routines!
;
;////////////////////////////////////////////////////////////////////
PROC CopyCGA
PUBLIC CopyCGA
ARG srcx:WORD,srcy:WORD,width:WORD,height:WORD,destx:WORD,desty:WORD
USES si,di
push ds
mov ax,0b800h
mov es,ax
mov ds,ax
shl [width],1
shl [destx],1
shl [srcx],1
mov ax,[srcy]
cmp ax,[desty]
jb @@1
ja @@2
mov ax,[srcx]
cmp ax,[destx]
jb @@0
;
; Copy from sourcex to destx, right
;
mov dx,[height]
mov bx,[srcy] ;source & dest are the same!
shl bx,1
cld
@@aa:
mov si,[ss:CGAlookup+bx]
mov di,si
add si,[srcx]
add di,[destx]
mov cx,[width]
rep movsb
add bx,2
dec dx
jnz @@aa
jz @@exit
;
; Copy from end of sourcex to end of destx, left
;
@@0:
mov dx,[height]
mov bx,[srcy] ;source & dest are the same!
shl bx,1
@@0a0:
mov si,[ss:CGAlookup+bx]
mov di,si
add si,[srcx]
add si,[width]
dec si
add di,[destx]
add di,[width]
dec di
mov cx,[width]
std
rep movsb
cld
add bx,2
dec dx
jnz @@0a0
jz @@exit
;
; Copy from end of sourcey to end of desty, up
;
@@1:
mov ah,[BYTE height]
mov dl,[BYTE srcy]
add dl,ah
dec dl
mov dh,[BYTE desty]
add dh,ah
dec dh
cld
@@1a0:
mov bx,[srcy]
add bx,[height]
dec bx
shl bx,1
mov si,[ss:CGAlookup+bx]
mov bx,[desty]
add bx,[height]
dec bx
shl bx,1
mov di,[ss:CGAlookup+bx]
add si,[srcx]
add di,[destx]
mov cx,[width]
rep movsb
dec [height]
jnz @@1a0
jz @@exit
;
; Copy from sourcey to desty, down
;
@@2:
mov ah,[BYTE height]
mov dl,[BYTE srcy]
mov dh,[BYTE desty]
cld
@@2a0:
mov bx,[srcy]
shl bx,1
mov si,[ss:CGAlookup+bx]
mov bx,[desty]
shl bx,1
mov di,[ss:CGAlookup+bx]
add si,[srcx]
add di,[destx]
mov cx,[width]
rep movsb
inc [srcy]
inc [desty]
dec [height]
jnz @@2a0
jz @@exit
@@exit:
pop ds
ret
ENDP
PROC CopyEGA
PUBLIC CopyEGA
ARG srcx:WORD,srcy:WORD,width:WORD,height:WORD,destx:WORD,desty:WORD
USES si,di
push ds
mov dx,GCindex
mov ax,GCmode OR 100h
out dx,ax
mov ax,0a000h
mov es,ax
mov ds,ax
mov ax,[srcy]
cmp ax,[desty]
jb @@1
ja @@2
mov ax,[srcx]
cmp ax,[destx]
jb @@0
;
; Copy from sourcex to destx, right
;
mov dx,[height]
mov bx,[srcy] ;source & dest are the same!
shl bx,1
cld
cmp [ss:videomode],2
jb @@a
@@aa:
mov si,[ss:EGA2lookup+bx]
mov di,si
add si,[srcx]
add di,[destx]
mov cx,[width]
rep movsb
add bx,2
dec dx
jnz @@aa
jz @@exit
@@a:
mov si,[ss:EGA1lookup+bx]
mov di,si
add si,[srcx]
add di,[destx]
mov cx,[width]
rep movsb
add bx,2
dec dx
jnz @@a
jz @@exit
;
; Copy from end of sourcex to end of destx, left
;
@@0:
mov dx,[height]
mov bx,[srcy] ;source & dest are the same!
shl bx,1
cmp [ss:videomode],2
jb @@0a
@@0a0:
mov si,[ss:EGA2lookup+bx]
mov di,si
add si,[srcx]
add si,[width]
dec si
add di,[destx]
add di,[width]
dec di
mov cx,[width]
std
rep movsb
cld
add bx,2
dec dx
jnz @@0a0
jz @@exit
@@0a:
mov si,[ss:EGA1lookup+bx]
mov di,si
add si,[srcx]
add si,[width]
dec si
add di,[destx]
add di,[width]
dec di
mov cx,[width]
std
rep movsb
cld
add bx,2
dec dx
jnz @@0a
jz @@exit
;
; Copy from end of sourcey to end of desty, up
;
@@1:
mov ah,[BYTE height]
mov dl,[BYTE srcy]
add dl,ah
dec dl
mov dh,[BYTE desty]
add dh,ah
dec dh
cld
cmp [ss:videomode],2
jb @@1a
@@1a0:
mov bx,[srcy]
add bx,[height]
dec bx
shl bx,1
mov si,[ss:EGA2lookup+bx]
mov bx,[desty]
add bx,[height]
dec bx
shl bx,1
mov di,[ss:EGA2lookup+bx]
add si,[srcx]
add di,[destx]
mov cx,[width]
rep movsb
dec [height]
jnz @@1a0
jz @@exit
@@1a:
mov bl,dl
xor bh,bh
shl bx,1
mov si,[ss:EGA1lookup+bx]
mov bl,dh
xor bh,bh
shl bx,1
mov di,[ss:EGA1lookup+bx]
add si,[srcx]
add di,[destx]
mov cx,[width]
rep movsb
dec dl
dec dh
dec ah
jnz @@1a
jz @@exit
;
; Copy from sourcey to desty, down
;
@@2:
mov ah,[BYTE height]
mov dl,[BYTE srcy]
mov dh,[BYTE desty]
cld
cmp [ss:videomode],2
jb @@2a
@@2a0:
mov bx,[srcy]
shl bx,1
mov si,[ss:EGA2lookup+bx]
mov bx,[desty]
shl bx,1
mov di,[ss:EGA2lookup+bx]
add si,[srcx]
add di,[destx]
mov cx,[width]
rep movsb
inc [srcy]
inc [desty]
dec [height]
jnz @@2a0
jz @@exit
@@2a:
mov bl,dl
xor bh,bh
shl bx,1
mov si,[ss:EGA1lookup+bx]
mov bl,dh
xor bh,bh
shl bx,1
mov di,[ss:EGA1lookup+bx]
add si,[srcx]
add di,[destx]
mov cx,[width]
rep movsb
inc dl
inc dh
dec ah
jnz @@2a
@@exit:
pop ds
ret
ENDP
PROC CopyVGA
PUBLIC CopyVGA
ARG srcx:WORD,srcy:WORD,width:WORD,height:WORD,destx:WORD,desty:WORD
USES si,di
push ds
mov ax,0a000h
mov es,ax
mov ds,ax
shl [width],3
shl [destx],3
shl [srcx],3
mov ax,[srcy]
cmp ax,[desty]
jb @@1
ja @@2
mov ax,[srcx]
cmp ax,[destx]
jb @@0
;
; Copy from sourcex to destx, right
;
mov dx,[height]
mov bx,[srcy] ;source & dest are the same!
shl bx,1
cld
@@aa:
mov si,[ss:VGAlookup+bx]
mov di,si
add si,[srcx]
add di,[destx]
mov cx,[width]
rep movsb
add bx,2
dec dx
jnz @@aa
jz @@exit
;
; Copy from end of sourcex to end of destx, left
;
@@0:
mov dx,[height]
mov bx,[srcy] ;source & dest are the same!
shl bx,1
@@0a0:
mov si,[ss:VGAlookup+bx]
mov di,si
add si,[srcx]
add si,[width]
dec si
add di,[destx]
add di,[width]
dec di
mov cx,[width]
std
rep movsb
cld
add bx,2
dec dx
jnz @@0a0
jz @@exit
;
; Copy from end of sourcey to end of desty, up
;
@@1:
mov ah,[BYTE height]
mov dl,[BYTE srcy]
add dl,ah
dec dl
mov dh,[BYTE desty]
add dh,ah
dec dh
cld
@@1a0:
mov bx,[srcy]
add bx,[height]
dec bx
shl bx,1
mov si,[ss:VGAlookup+bx]
mov bx,[desty]
add bx,[height]
dec bx
shl bx,1
mov di,[ss:VGAlookup+bx]
add si,[srcx]
add di,[destx]
mov cx,[width]
rep movsb
dec [height]
jnz @@1a0
jz @@exit
;
; Copy from sourcey to desty, down
;
@@2:
mov ah,[BYTE height]
mov dl,[BYTE srcy]
mov dh,[BYTE desty]
cld
@@2a0:
mov bx,[srcy]
shl bx,1
mov si,[ss:VGAlookup+bx]
mov bx,[desty]
shl bx,1
mov di,[ss:VGAlookup+bx]
add si,[srcx]
add di,[destx]
mov cx,[width]
rep movsb
inc [srcy]
inc [desty]
dec [height]
jnz @@2a0
jz @@exit
@@exit:
pop ds
ret
ENDP
;////////////////////////////////////////////////////////////////////
;
; OVERLAY routine
;
;////////////////////////////////////////////////////////////////////
PROC Overlay
PUBLIC Overlay
ARG tsize:WORD
push di
push si
mov di,OFFSET tdata
mov bx,[tsize]
shl bx,1
mov si,[videomode]
shl si,1
mov ax,[OverTable+si]
jmp ax
LABEL OverlayCGA PROC
mov cx,[csize+bx-2]
shr cx,1
mov si,[Csparse+bx-2]
@@c1: lodsw
or [di],ax
add di,2
loop @@c1
pop si
pop di
ret
LABEL OverlayEGA PROC
mov cx,[esize+bx-2]
shr cx,1
mov si,[Esparse+bx-2]
@@e1: lodsw
or [di],ax
add di,2
loop @@e1
pop si
pop di
ret
LABEL OverlayVGA PROC
mov cx,[vsize+bx-2]
shr cx,1
mov si,[Vsparse+bx-2]
@@v1: lodsw
or [di],ax
add di,2
loop @@v1
pop si
pop di
ret
ENDP
END